package com.rocky.study.volatitle;

/**
 * TODO 演示多线程情况下出现指令重排场景
 */
public class VolatileDemo4 {
    /**
     * 计算机在执行程序时,为了提高性能,编译器和处理器常常会对 指令做重排
     * 源代码 ---> 编译器优化后的重排 ---> 指令并行的重排 ---> 内存系统的重排 -->最终执行的指令
     * 1.单机环境里面 确保 程序最终执行结果 和 代码顺序执行的结果一致
     * 2.处理器在进行重排序时必须考虑 指令间 的 数据依赖性
     * 3.多线程环境中 线程交替执行, 由于编译器优化重排的存在,2个线程中使用的变量能否保证一致性 是无法确定的,结果无法预测
     */
    // 编译器会有优化 多线程的情况下执行顺序不一样导致数据的最终一致性无法保证

    int a = 0;
    boolean flag = false;

    public void method1() {
        a = 1;
        flag = true;
    }

    public void method2() {
        if (flag) {
            a = a + 5;
            System.out.println("this number value: " + a);
        }
    }

    public static void main(String[] args) {
//        oneThread();
        VolatileDemo4 demo4 = new VolatileDemo4();
        new Thread(() -> {
            demo4.method1();
            demo4.method2();
        }, "t1").start();
        new Thread(() -> {
            demo4.method1();
            demo4.method2();
        }, "t2").start();
    }

    private static void oneThread() {
        VolatileDemo4 demo04 = new VolatileDemo4();
        demo04.method1();
        demo04.method2();
    }
}
